package mb.admin.dao;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.faces.model.SelectItem;
import javax.xml.xpath.XPathExpressionException;

import mb.admin.data.DepartmentsData;
import mb.commons.AbstractDAO;
import mb.commons.DbConnection;
import mb.commons.XmlHelper;

/**
 * Klasa dostępu do bazy danych dla managera oddziałów 
 * @author Michał Budziło
 *
 */
public class DepartmentsDAO extends AbstractDAO {
	/**
	 * Konstruktor
	 */
	public DepartmentsDAO() {
		conn = DbConnection.getConnection();
		helper = new XmlHelper("WEB-INF/xml/admin/departments.xml");
	}

	/**
	 * Metoda pobiera z bazy danych listę oddziałów
	 * @return zwraca listę oddziałów
	 */
	public ArrayList<DepartmentsData> getDepartmentsList() {
		ArrayList<DepartmentsData> list = new ArrayList<DepartmentsData>();
		DepartmentsData data;
		try {
			query = helper.getSqlString("departmentsList",
					"sqlString/prepareMain/sql");
			stmt = conn.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				data = new DepartmentsData();

				//sety
				data.setIdOddzialu(rs.getInt("id"));
				data.setNazwa(rs.getString("nazwa"));
				data.setAdres(rs.getString("adres"));
				data.setTelefon(rs.getString("telefon"));
				data.setLonga(rs.getBigDecimal("long"));
				data.setLat(rs.getBigDecimal("lat"));
				data.setGlowny(rs.getInt("glowny"));
				data.setNadrzedny(rs.getInt("nadrzedny"));
				data.setKod1(rs.getInt("kod1"));
				data.setKod2(rs.getInt("kod2"));
				


				list.add(data);
			}
			return list;
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			close();
		}
		return null;
	}
	
	
	/**
	 * Metoda wstawia do bazy danych nowy oddział
	 * @param data obiekt klasy 'odział'
	 */
	public void insertData(DepartmentsData data) {
		try {
			query = helper.getSqlString("insertData","sqlString/prepareMain/prepareStatment");
			prepStmt = conn.prepareStatement(query);
			
			prepStmt.setString(1, data.getNazwa());
			prepStmt.setString(2, data.getAdres());
			prepStmt.setString(3, data.getTelefon());
			prepStmt.setBigDecimal(4, data.getLonga());
			prepStmt.setBigDecimal(5, data.getLat());
			prepStmt.setInt(6, data.getGlowny());
			if(data.getNadrzedny()==null)
			{
				prepStmt.setNull(7, java.sql.Types.INTEGER);
			}else
			{
				prepStmt.setInt(7, data.getNadrzedny());
				
			}
			
			if(data.getKod1()==null)
				prepStmt.setNull(8, java.sql.Types.INTEGER);
			else
			prepStmt.setInt(8, data.getKod1() );
			
			if(data.getKod2()==null)
				prepStmt.setNull(9, java.sql.Types.INTEGER);
			else
			prepStmt.setInt(9, data.getKod2());
			
			
			prepStmt.executeUpdate();
			
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			close();
		}
		
	}
	 /**
	  * Metoda aktualizuje w bazie danych wybrany oddział
	 * @param data obiekt klasy 'oddział'
	 */
	public void updateData(DepartmentsData data) {
		try {
			query = helper.getSqlString("updateData","sqlString/prepareMain/prepareStatment");
			prepStmt = conn.prepareStatement(query);
			
			prepStmt.setString(1, data.getNazwa());
			prepStmt.setString(2, data.getAdres());
			prepStmt.setString(3, data.getTelefon());
			prepStmt.setBigDecimal(4, data.getLonga());
			prepStmt.setBigDecimal(5, data.getLat());
			prepStmt.setInt(6, data.getGlowny());
			prepStmt.setInt(7, data.getNadrzedny());
			prepStmt.setInt(8, data.getKod1() );
			prepStmt.setInt(9, data.getKod2());
			prepStmt.setInt(10, data.getIdOddzialu());
			
			prepStmt.executeUpdate();
			
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			close();
		}
		
	}
	 
	 /**
	  * Metoda usuwa z bazy danych wybrany oddział
	 * @param data obiekt klasy 'oddział'
	 */
	public void deleteData(DepartmentsData data) {
			
			try {
				query = helper.getSqlString("deleteData","sqlString/prepareMain/prepareStatment");
				prepStmt = conn.prepareStatement(query);
				prepStmt.setInt(1, data.getIdOddzialu());
				
				prepStmt.executeUpdate();
				
			} catch (SQLException e) {
				error(e.getErrorCode() + " : " + e.getMessage());
				e.printStackTrace();
			} catch (XPathExpressionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				
				close();
			}
		}
	 
	 /**
	  * Metoda pobiera z bazy danych listę oddziałów typu 'centrum'
	 * @return zwraca listę oddziałów typu 'centrum'
	 */
	public ArrayList<SelectItem> getCentrumList()
	 {
		 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
			try {
				query = helper.getSqlString("getCentrum",
						"sqlString/prepareMain/sql");
				stmt = conn.createStatement();
				rs = stmt.executeQuery(query);
				while (rs.next()) {
					SelectItem tmp = new SelectItem();
					tmp.setLabel(rs.getInt("id") + " | " + rs.getString("nazwa"));
					tmp.setValue(rs.getInt("id"));

					list.add(tmp);
				}
				return list;
			} catch (SQLException e) {
				error(e.getErrorCode() + " : " + e.getMessage());
				e.printStackTrace();
			} catch (XPathExpressionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				close();
			}
			return null;
	 }
	 
	 
	 /**
	  * Metoda pobiera z bazy danych listę oddziałów typu 'główny'
	 * @return lista oddziałów typu 'główny'
	 */
	public ArrayList<SelectItem> getGlownyList()
	 {
		 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
			try {
				query = helper.getSqlString("getGlownyOddzial",
						"sqlString/prepareMain/sql");
				stmt = conn.createStatement();
				rs = stmt.executeQuery(query);
				while (rs.next()) {
					SelectItem tmp = new SelectItem();
					tmp.setLabel(rs.getInt("id") + " | " + rs.getString("nazwa"));
					tmp.setValue(rs.getInt("id"));

					list.add(tmp);
				}
				return list;
			} catch (SQLException e) {
				error(e.getErrorCode() + " : " + e.getMessage());
				e.printStackTrace();
			} catch (XPathExpressionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				close();
			}
			return null;
	 }

}
